//
//Copyright GX. Yuan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/**
 * @file net.go
 * @brief Leetcode 剑指Offer 第二版
 * @details 剑指 Offer 07. 重建二叉树
 * @author GX. Yuan  any question please send mail to yuanguanxu@qq.com
 * @date 2021-6-28
 * @version V1.0
 * @attention 硬件平台: windows 10 家庭版
 * SDK版本：Go 1.16.5
 * IDE版本：GoLand 2020.2.3
 */
package main

// 定义二叉树结构
//type TreeNode struct {
//	Val   int
//	Left  *TreeNode
//	Right *TreeNode
//}

// 根据前序遍历和中序遍历 建立二叉树;
func buildTree(preorder []int, inorder []int) *TreeNode {
	//获取前序遍历节点的大小 根据参数，来确定的递归问题处理的边界;
	if len(preorder) == 0 {
		return nil
	}
	// 建立一个节点，赋值根节点;
	root := &TreeNode{preorder[0], nil, nil}
	i := 0
	// 遍历中序遍历，找到中路遍历中节点的位置;
	for ; i < len(inorder); i++ {
		if inorder[i] == preorder[0] {
			break // i 在中序遍历的中位置， 此时就是根节点所在的位置
		}
	}
	// 交由子问题节点进行处理，这种细节的处理方式不必在意;
	root.Left = buildTree(preorder[1:len(inorder[:i])+1], inorder[:i])   // 明确子问题：是一个相似问题，仅仅是这个问题的，输入的参数不同；
	root.Right = buildTree(preorder[len(inorder[:i])+1:], inorder[i+1:]) // 明确子问题：是一个递归问题，仅仅是这个问题的与外部的问题的参数不同；
	return root
}
// 迭代法的处理方式

func main() {
	// 切片数组的处理方式
	//nums := []int{0, 1, 2, 3, 4, 5}
	//fmt.Println(nums[0:1])         //不包含最后一位的位置罢了
	//fmt.Println(nums[1:len(nums)]) // 为了输出最后以为数字;那么必然包括所在的位置
	//fmt.Println(len(nums))
}

// 递归的方式
// 什么是递归：递归（英语：Recursion），又译为递回，在数学与计算机科学中，是指在函数的定义中使用函数自身的方法；
// 递归处理问题的方式就是：将重复的部分问题放入到自己的处理部分；造成问题的重复处理方式，造成递归；
// 根据程序的二叉树规则：
// 输入二叉树的前序遍历和中序遍历 重建二叉树 ,遍历读取的序列，并不包含重复的内容;
// 规则: 重建二叉树
